import axios from 'axios'
import qs from 'qs'

// 1. 创建实例
let instance = axios.create(({
  timeout: 3000,        // 设置超时时间
  withCredentials: true, // 设置跨域是否允许携带凭证
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded' // 设置post请求头
  },
  transformRequest: data => qs.stringify(data)  // 服务器请求主体的数据格式
}))


/**
 * 按照请求类型对axios进行封装
 */
const api = {
  /**
   * get 请求
   */
  get (url, params) {
    return instance({
      method: 'get',
      url,
      params,
    })
  },
  /**
   * post 请求，传递 json数据
   * @param url接口地址
   * @param data
   */
  post (url, data) {
    return instance({
      method: 'post',
      url,
      data: data,
    })
  },
  /**
   * delete 请求
   */
  delete (url, params) {
    return instance({
      method: 'delete',
      url,
      params,
    })
  },
}

/**
 * 请求拦截器，所有请求携带usertoken
 */
instance.interceptors.request.use(config => {
  const token = localStorage.getItem('usertoken')
  token && (config.headers.Authorization = token)
  return config
}, error => {
  router.push({
    path: '/login',
    query: { redirect: router.currentRoute.fullPath }
  })
  return Promise.reject(error);
})

/**
 * 响应拦截器，统一处理返回码
 */
instance.interceptors.response.use(res => {
  // 2xx响应码触发，处理响应数据
  let token = res.headers.authorization
  if (token) {
    // token保存在localStorage 中
    localStorage.setItem('userToken', token)
  }
  return res
}, error => {
  // 超出2xx范围的状态码触发，处理响应错误
  if (error && error.response) {
    switch (error.response.status) {
      // 401: 未登录
      // 未登录则跳转登录页面，并携带当前页面的路径
      // 在登录成功后返回当前页面，这一步需要在登录页操作。
      case 401:
        console.log("尚未登录，请登录");
        this.$route.replace({
          path: '/login',
          query: { redirect: router.currentRoute.fullPath }
        });
        break;
      // 403 token过期
      // 登录过期对用户进行提示
      // 清除本地token和清空vuex中token对象
      // 跳转登录页面
      case 403:
        console.log("登录过期，请重新登录");
        localStorage.removeItem('token');
        // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
        setTimeout(() => {
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          });
        }, 1000);
        break;
      // 404请求不存在
      case 404:
        console.log("404");
        break;
      case 500:
        console.log("服务器出错");
        break;
      default:
        console.log("未知错误");
    }
  }
  return Promise.reject(error);
})
export default api
